﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Biblioteca.Models;
using System.Data;
using Biblioteca.Interfaces;

namespace Biblioteca.Controllers
{
    public class ReservasController : Controller
    {
        private BibliotecaStore db;
        private IMaterial MaterialRepo;
        private IReserva ReservaRepo;
        private IAutor AutorRepo;
        private ITema TemaRepo;
        private ICuentaUsuario CuentaRepo;

        public ReservasController(IMaterial mr, IReserva rr, IAutor ar, ITema tr,ICuentaUsuario cr, BibliotecaStore data)
        {
            this.MaterialRepo = mr;
            this.ReservaRepo = rr;
            this.AutorRepo = ar;
            this.TemaRepo = tr;
            this.CuentaRepo = cr;
            this.db = data;
        }

        //
        // GET: /Reservas/

        public ActionResult Index()
        {
            /* cargo los datos necesarios para la busqueda*/

            ViewBag.autores = new SelectList(AutorRepo.getAll(), "idAutor", "apellido");
            ViewBag.temas = new SelectList(TemaRepo.getAll(), "idTema", "Nombre");

            return View();
        }
        public ActionResult busqueda(FormCollection form)
        {
            String autor = form.Get("autores");
            String titulo = form.Get("titulo");
            String tema = form.Get("temas");
            String isbn = form.Get("isbn");
            
            ViewBag.iniciado = 0;

            return View(MaterialRepo.obtainFilter(autor,titulo,tema,isbn));
        }
        public ActionResult mostrar(int id)
        {
            Material material = MaterialRepo.getSingle(id);

            ViewBag.autores = material.Autors.ToList();
            ViewBag.disponibilidad = material.Ejemplars.Where(m => m.Disponible == 1).Count();
            ViewBag.catalogo = material.Temas.ToList();
            return View(material);
        }
        public ActionResult concretar()
        {
            int id = int.Parse(Request.Form["idMaterial"]);
            var dias = int.Parse(Request.Form["days"]);
            int idUsuario = this.CuentaRepo.getID(User.Identity.Name);

            //Transaction Script para concretar la reserva
            //TODO: se deberia controlar las reservas del usuario
            //obtengo el material correspondiente
            Material material = MaterialRepo.getSingle(id);
            //obtengo la cantidad ejemplares disponibles del material
            int cantidad = material.Ejemplars.Where(m => m.Disponible == 1).Count();
            //obtengo la cantidad de reservas del usuario (activas o pendientes)
            int reservarActivas = ReservaRepo.obtenerReservasActivasUsuario(idUsuario);
            int puedeReservar = ReservaRepo.obtenerReservaMaterialUsuario(id, idUsuario);
            if (dias > 30)
            {
                ViewBag.Estado = "No puede hacer una reserva por la cantidad de dias solicitada. Por favor, cambie la cantidad";
            }
            else
            {
                if (puedeReservar == 1)
                {
                    ViewBag.Estado = "Ya existe una reserva de Udt para este material. Cancele la reserva accediendo de Mis Movimientos, y vuelva a realizar la reserva";
                }
                else
                {
                    if (reservarActivas > 5)
                    {
                        ViewBag.Estado = "No pueden hacerse mas de 5 reservas";
                    }
                    else
                    {
                        // creo el objecto de reserva
                        Reserva nuevo = new Reserva();
                        //agrego los datos necesarios
                        nuevo.Dias = dias;
                        nuevo.Material = id;
                        nuevo.Usuario = idUsuario;
                        nuevo.FechaPedido = DateTime.Today;
                        if (cantidad == 0)
                        {
                            nuevo.Estado = 1;
                            ViewBag.Estado = "Su reserva fue registrada, pero se efectivizara cuando haya ejemplares disponibles";
                        }
                        else
                        {
                            nuevo.Estado = 2;
                            nuevo.Vencimiento = DateTime.Today.AddDays(3);
                            ViewBag.Estado = "Su reserva fue registrada y efectiva. Udt tiene 3 dias para realizar el despacho";
                        }

                        ReservaRepo.crearReserva(nuevo);

                    }
                }
            }
            return View();
        }

        public ActionResult activas(int id)
        {
            var reservasActivas = ReservaRepo.obtenerReservasActivas(id);
           return View(reservasActivas);
        }
        [HttpPost]
        public ActionResult cancelar()
        {
            int id= int.Parse(Request["idReserva"].ToString());
            Reserva reservaCancel = ReservaRepo.getSingle(id);
            reservaCancel.Estado = 3;
            ReservaRepo.cancelarReserva(reservaCancel);
            return View();
        }
    }
}
